<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>RTX Migration Guide</title>
<title>CMSIS-RTOS2: RTX Migration Guide</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="cmsis.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="printComponentTabs.js"></script>
<script type="text/javascript" src="cmsis_footer.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
  $(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 46px;">
  <td id="projectlogo"><img alt="Logo" src="CMSIS_Logo_Final.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">CMSIS-RTOS2
   &#160;<span id="projectnumber">Version 2.1.3</span>
   </div>
   <div id="projectbrief">Real-Time Operating System: API and RTX Reference Implementation</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<div id="CMSISnav" class="tabs1">
    <ul class="tablist">
      <script type="text/javascript">
		<!--
		writeComponentTabs.call(this);
		//-->
      </script>
	  </ul>
</div>
<!-- Generated by Doxygen 1.8.6 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li class="current"><a href="pages.html"><span>Usage&#160;and&#160;Description</span></a></li>
      <li><a href="modules.html"><span>Reference</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('os2MigrationGuide.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">RTX Migration Guide </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>RTX5 supplies both API layers: CMSIS-RTOS v1 and CMSIS-RTOS v2. This allows a gradient transition from version 1 to 2. A modified v1 header and a special v1 compatibility module enable existing code to run on a v2 implementation with almost no modifications.</p>
<p>Only a few incompatibilities and limitations exist:</p>
<ul>
<li>Kernel startup<br/>
<ul>
<li>The function <code>osKernelRunning</code> has been removed in CMSIS-RTOS v2, use <a class="el" href="group__CMSIS__RTOS__KernelCtrl.html#ga48b69b81012fce051f639be288b243ba" title="Get the current RTOS Kernel state. ">osKernelGetState()</a> instead.</li>
<li>Function <code>main</code> was usually a running thread in CMSIS-RTOS v1 implementations, which is not the case in CMSIS-RTOS v2 anymore. The Kernel was running even without calling corresponding APIs to initialize and start the Kernel explicitly. In CMSIS-RTOS v2 the Kernel needs be initialized by calling <a class="el" href="group__CMSIS__RTOS__KernelCtrl.html#gae818f6611d25ba3140bede410a52d659" title="Initialize the RTOS Kernel. ">osKernelInitialize()</a> and must be started by calling <a class="el" href="group__CMSIS__RTOS__KernelCtrl.html#ga9ae2cc00f0d89d7b6a307bba942b5221" title="Start the RTOS Kernel scheduler. ">osKernelStart()</a>.</li>
</ul>
</li>
<li>OS tick<br/>
 RTX5 uses the <a class="el" href="group__CMSIS__RTOS__TickAPI.html">OS Tick API</a> to configure the tick interrupts. The interval calculation is typically based on <code>SystemCoreClock</code> variable. Thus one has to assure this variable is set correctly before calling <a class="el" href="group__CMSIS__RTOS__KernelCtrl.html#ga9ae2cc00f0d89d7b6a307bba942b5221">osKernelStart</a>.</li>
<li>The function <code>osWait</code> is deprecated.</li>
<li>Error code incompatibility<br/>
 CMSIS-RTOS v1 used two different error codes for invalid parameters: <code>osErrorParameter</code> and <code>osErrorValue</code>. The new version only uses a common <a class="el" href="cmsis__os2_8h.html#ga6c0dbe6069e4e7f47bb4cd32ae2b813eac24adca6a5d072c9f01c32178ba0d109">osErrorParameter</a> code. Therefore, code relying on osErrorValue is not compatible. The following functions are affected:<ul>
<li><a class="el" href="group__CMSIS__RTOS__ThreadMgmt.html#ga861a420fb2d643115b06622903fb3bfb">osThreadSetPriority</a> returns <a class="el" href="cmsis__os2_8h.html#ga6c0dbe6069e4e7f47bb4cd32ae2b813eac24adca6a5d072c9f01c32178ba0d109">osErrorParameter</a> instead of osErrorValue when priority is out of range</li>
<li><a class="el" href="group__CMSIS__RTOS__PoolMgmt.html#gabb4f4560daa6d1f8c8789082ee186d16">osMemoryPoolFree</a> (previously <code>osPoolFree</code>) returns <a class="el" href="cmsis__os2_8h.html#ga6c0dbe6069e4e7f47bb4cd32ae2b813eac24adca6a5d072c9f01c32178ba0d109">osErrorParameter</a> instead of osErrorValue when block to be returned is invalid</li>
</ul>
</li>
<li>The <a class="el" href="group__CMSIS__RTOS__Wait.html#gaf6055a51390ef65b6b6edc28bf47322e">osDelay</a> return code has changed from osErrorTimeout to <a class="el" href="cmsis__os2_8h.html#ga6c0dbe6069e4e7f47bb4cd32ae2b813ea9e1c9e2550bb4de8969a935acffc968f">osOK</a>.</li>
</ul>
<p>The level of migration depends on the project's phase in its life cycle:</p>
<ul>
<li>The <a class="el" href="os2MigrationGuide.html#MigL1">first level</a> of migration is to migrate to RTX5 without changing the API level.</li>
<li>The <a class="el" href="os2MigrationGuide.html#MigL2">second level</a> in the transition is to use v2 API functions and v1 API functions in mixed variation.</li>
<li>The <a class="el" href="os2MigrationGuide.html#MigL3">third level</a> is the full transition to the API v2. It is non-trivial and requires some additional development effort to migrate all API v1 calls to v2.</li>
</ul>
<h1><a class="anchor" id="MigL1"></a>
Level 1 Migration - Upgrade to RTX5 on API v1</h1>
<p>Upgrade to RTX Version 5 from any 4.x version using the API v1 compatibility layer. Configure an existing project as follows:</p>
<ul>
<li>Open <b>Manage</b> <b>Run-Time</b> <b>Environment</b> window</li>
<li>Expand <b>CMSIS</b> software component.</li>
<li>Expand <b>RTOS</b> <b></b>(API), uncheck <b>Keil</b> <b>RTX</b>, and select <b>Keil</b> <b>RTX5</b>.</li>
<li>Expand <b>RTOS2</b> <b></b>(API) and select <b>Keil</b> <b>RTX5</b>.</li>
<li>Resolve missing components.</li>
</ul>
<div class="image">
<img src="RTX5_Migrate1.PNG" alt="RTX5_Migrate1.PNG"/>
<div class="caption">
Component Selection for RTX5</div></div>
<ul>
<li>Click OK.</li>
<li>Expand <b>CMSIS</b> group in the <b>Project</b> window:</li>
<li>Open <b>RTX_Config.h</b> and adapt the configuration to suit the application including (refer to <a class="el" href="config_rtx5.html">Configure RTX v5</a>):<ul>
<li>System Configuration-&gt;Global Dynamic Memory size</li>
<li>Kernel Tick Frequency</li>
<li>Thread Configuration-&gt;Default Thread Stack size</li>
</ul>
</li>
<li>Rename function <code>int main (void)</code> to <code>void app_main (void *arg)</code>.</li>
<li>Create a new function <code>int main (void)</code> which implements at least:<ul>
<li>System initialization and configuration</li>
<li>Update <a href="../../Core/html/group__system__init__gr.html">SystemCoreClock</a></li>
<li>Initialize CMSIS-RTOS kernel</li>
<li>Creates new thread app_main</li>
<li>Start RTOS scheduler</li>
</ul>
</li>
</ul>
<p><b>Example - Application Main Thread</b> </p>
<div class="fragment"><div class="line"><span class="preprocessor">#include &quot;RTE_Components.h&quot;</span></div>
<div class="line"><span class="preprocessor">#include CMSIS_device_header</span></div>
<div class="line"><span class="preprocessor"></span> </div>
<div class="line"><span class="comment">/* Renamed main() function */</span></div>
<div class="line"><span class="keywordtype">void</span> app_main (<span class="keywordtype">void</span> <span class="keyword">const</span> *argument) {</div>
<div class="line">  <span class="comment">// contents of old &quot;main&quot;</span></div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line">osThreadDef(app_main, <a class="code" href="cmsis__os2_8h.html#gad4e3e0971b41f2d17584a8c6837342eca45a2895ad30c79fb97de18cac7cc19f1">osPriorityNormal</a>, 1, 0);</div>
<div class="line"> </div>
<div class="line"><span class="keywordtype">int</span> main (<span class="keywordtype">void</span>) {</div>
<div class="line">  <span class="comment">// System Initialization</span></div>
<div class="line">  SystemCoreClockUpdate();</div>
<div class="line">  <span class="comment">// ...</span></div>
<div class="line">  <a class="code" href="group__CMSIS__RTOS__KernelCtrl.html#gae818f6611d25ba3140bede410a52d659">osKernelInitialize</a>();</div>
<div class="line">  osThreadCreate(osThread(app_main), NULL);</div>
<div class="line">  <a class="code" href="group__CMSIS__RTOS__KernelCtrl.html#ga9ae2cc00f0d89d7b6a307bba942b5221">osKernelStart</a>();</div>
<div class="line">  <span class="keywordflow">for</span> (;;);</div>
<div class="line">}</div>
</div><!-- fragment --><dl class="section note"><dt>Note</dt><dd>In RTOS API v1 all timings were specified in milliseconds. RTX5 defines all times in kernel ticks. To match both it is recommended to set the Kernel Tick Frequency to 1000 Hz in the <a class="el" href="config_rtx5.html#systemConfig">System Configuration</a>.</dd></dl>
<p>To validate the correct operation of your RTOS after migration you can temporarily integrate the <a class="el" href="rtosValidation.html">RTOS Validation</a> component into your project.</p>
<h1><a class="anchor" id="MigL2"></a>
Level 2 Migration - Use API v2 and v1 alongside in RTX5</h1>
<p>Implementing new features in your project is ideally done using the new API. Both API versions are offered in RTX5 and can exist along-side.</p>
<p>The component selection is identical to Migration Level 1.</p>
<p>Include "cmsis_os2.h" in all modules where access to API v2 functions is required.</p>
<div class="fragment"><div class="line"><span class="preprocessor">#include &quot;cmsis_os.h&quot;</span>                   <span class="comment">// ARM::CMSIS:RTOS:Keil RTX5</span></div>
<div class="line"><span class="preprocessor">#include &quot;<a class="code" href="cmsis__os2_8h.html">cmsis_os2.h</a>&quot;</span>                  <span class="comment">// ARM::CMSIS:RTOS2:Keil RTX5</span></div>
</div><!-- fragment --><p>The following snippet shows how threads - created with both API versions - live along-side:</p>
<div class="fragment"><div class="line"><span class="comment">/*----------------------------------------------------------------------------</span></div>
<div class="line"><span class="comment"> *      Thread 4 &#39;phaseD&#39;: Phase D output   - API v2 thread</span></div>
<div class="line"><span class="comment"> *---------------------------------------------------------------------------*/</span></div>
<div class="line"><span class="keywordtype">void</span> phaseD (<span class="keywordtype">void</span> *argument) {</div>
<div class="line">  <span class="keywordflow">for</span> (;;) {</div>
<div class="line">    <a class="code" href="group__CMSIS__RTOS__ThreadFlagsMgmt.html#gac11542ad6300b600f872fc96e340ec2b">osThreadFlagsWait</a>(0x0001, <a class="code" href="group__CMSIS__RTOS__Definitions.html#ga18e63587b8450d5b8798b6f6ec04e012">osFlagsWaitAny</a>, <a class="code" href="group__CMSIS__RTOS__Definitions.html#ga9eb9a7a797a42e4b55eb171ecc609ddb">osWaitForever</a>);    <span class="comment">/* wait for an event flag 0x0001 */</span></div>
<div class="line">    Switch_On (LED_D);</div>
<div class="line">    signal_func(tid_phaseA);                                     <span class="comment">/* call common signal function   */</span></div>
<div class="line">    Switch_Off(LED_D);</div>
<div class="line">  }</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line"><span class="comment">/*----------------------------------------------------------------------------</span></div>
<div class="line"><span class="comment"> *      Thread 5 &#39;clock&#39;: Signal Clock  - API v1 thread</span></div>
<div class="line"><span class="comment"> *---------------------------------------------------------------------------*/</span></div>
<div class="line"><span class="keywordtype">void</span> clock (<span class="keywordtype">void</span> <span class="keyword">const</span> *argument) {</div>
<div class="line">  <span class="keywordflow">for</span> (;;) {</div>
<div class="line">    osSignalWait(0x0100, <a class="code" href="group__CMSIS__RTOS__Definitions.html#ga9eb9a7a797a42e4b55eb171ecc609ddb">osWaitForever</a>);    <span class="comment">/*  Wait for event send by API v2 function osThreadFlagsSet() */</span></div>
<div class="line">    Switch_On (LED_CLK);</div>
<div class="line">    <a class="code" href="group__CMSIS__RTOS__Wait.html#gaf6055a51390ef65b6b6edc28bf47322e">osDelay</a>(80);                            <span class="comment">/* delay ticks                    */</span></div>
<div class="line">    Switch_Off(LED_CLK);</div>
<div class="line">  }</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line"><span class="comment">/* Define the API v1 thread */</span></div>
<div class="line">osThreadDef(clock,  <a class="code" href="cmsis__os2_8h.html#gad4e3e0971b41f2d17584a8c6837342eca45a2895ad30c79fb97de18cac7cc19f1">osPriorityNormal</a>, 1, 0);</div>
<div class="line"> </div>
<div class="line"><span class="comment">/*----------------------------------------------------------------------------</span></div>
<div class="line"><span class="comment"> *      Main: Initialize and start RTX Kernel</span></div>
<div class="line"><span class="comment"> *---------------------------------------------------------------------------*/</span></div>
<div class="line"><span class="keywordtype">void</span> app_main (<span class="keywordtype">void</span> *argument) {</div>
<div class="line"></div>
<div class="line">  ; <span class="comment">//...</span></div>
<div class="line">  <span class="comment">/* Create the API v2 thread */</span></div>
<div class="line">  tid_phaseD = <a class="code" href="group__CMSIS__RTOS__ThreadMgmt.html#ga48d68b8666d99d28fa646ee1d2182b8f">osThreadNew</a>(phaseD, NULL, NULL);</div>
<div class="line">  <span class="comment">/* Create the API v1 thread */</span></div>
<div class="line">  tid_clock  = osThreadCreate(osThread(clock),  NULL);</div>
<div class="line"> </div>
<div class="line">  <a class="code" href="group__CMSIS__RTOS__ThreadFlagsMgmt.html#ga6f89ef9caded1d9963c7b12b0f6412c9">osThreadFlagsSet</a>(tid_phaseA, 0x0001);          <span class="comment">/* set signal to phaseA thread   */</span></div>
<div class="line"> </div>
<div class="line">  <a class="code" href="group__CMSIS__RTOS__Wait.html#gaf6055a51390ef65b6b6edc28bf47322e">osDelay</a>(<a class="code" href="group__CMSIS__RTOS__Definitions.html#ga9eb9a7a797a42e4b55eb171ecc609ddb">osWaitForever</a>);</div>
<div class="line">  <span class="keywordflow">while</span>(1);</div>
<div class="line">}</div>
</div><!-- fragment --><p>The full example "RTX5 Migration" is part of the CMSIS5 pack and available from the pack installer.</p>
<h1><a class="anchor" id="MigL3"></a>
Level 3 Migration - Full transition to API v2</h1>
<p>Migrating fully to APIv2 reduces the overhead of the translation layer and simplifies the project. There is some effort to replace and re-test all API Version 1 calls. The following steps are recommended as a rough guide-line:</p>
<ul>
<li>Open Manage Run-Time Environment window:</li>
<li>Expand CMSIS Software Component:</li>
<li>Expand RTOS (API) Software Component and de-select Keil RTX5</li>
<li>Click OK</li>
<li>Exchange all occurrences of <div class="fragment"><div class="line"><span class="preprocessor">#include &quot;cmsis_os.h&quot;</span>  </div>
</div><!-- fragment --> with <div class="fragment"><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="cmsis__os2_8h.html">cmsis_os2.h</a>&quot;</span>  </div>
</div><!-- fragment --></li>
<li>Identify all references to the API v1 and replace with the appropriate calls in v2. You might want to use the Error List window in uVision to identify the related code passages quickly.</li>
</ul>
<dl class="section note"><dt>Note</dt><dd>See <a class="el" href="os2MigrationFunctions.html">Detailed API Function Differences</a> for details in differences.</dd></dl>
<p>Generally there are no longer os*Def macros to declare OS objects.</p>
<dl class="section note"><dt>Note</dt><dd><ul>
<li>Signal Events have been replaced. Use the functions listed under Thread Flags and Event Flags instead.</li>
<li>The Mail Queue RTOS v1 functions have been deprecated. Use the functionality of the Message Queue instead. Differences are listed under <a class="el" href="os2MigrationFunctions.html#mig_msgQueue">Message Queue</a>. </li>
</ul>
</dd></dl>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="index.html">index</a></li><li class="navelem"><a class="el" href="os2Migration.html">Migration from API v1 to API v2</a></li>
    <li class="footer">
      <script type="text/javascript">
        <!--
        writeFooter.call(this);
        //-->
      </script>    
    </li>
  </ul>
</div>
</body>
</html>
